winsafe\psapi\handles/
hprocess.rs1#![allow(non_camel_case_types, non_snake_case)]
2
3use crate::decl::*;
4use crate::kernel::privs::*;
5use crate::prelude::*;
6use crate::psapi::ffi;
7
8impl HPROCESS {
9 pub fn EmptyWorkingSet(&self) -> SysResult<()> {
12 bool_to_sysresult(unsafe { ffi::EmptyWorkingSet(self.ptr()) })
13 }
14
15 #[must_use]
18 pub fn EnumProcessModules(&self) -> SysResult<Vec<HINSTANCE>> {
19 loop {
20 let mut bytes_needed = 0u32;
21 bool_to_sysresult(unsafe {
22 ffi::EnumProcessModules(self.ptr(), std::ptr::null_mut(), 0, &mut bytes_needed)
23 })?;
24
25 let elems_needed = bytes_needed / (std::mem::size_of::<HINSTANCE>() as u32);
26 let mut buf = (0..elems_needed)
27 .map(|_| HINSTANCE::NULL)
28 .collect::<Vec<_>>();
29
30 let mut bytes_got = 0u32;
31 bool_to_sysresult(unsafe {
32 ffi::EnumProcessModules(
33 self.ptr(),
34 buf.as_mut_ptr() as _,
35 bytes_needed,
36 &mut bytes_got,
37 )
38 })?;
39
40 if bytes_needed == bytes_got {
41 return Ok(buf);
42 }
43 }
44 }
45
46 #[must_use]
49 pub fn GetMappedFileName(&self, address: *mut std::ffi::c_void) -> SysResult<String> {
50 let mut buf = WString::new_alloc_buf(MAX_PATH + 1); bool_to_sysresult(unsafe {
52 ffi::GetMappedFileNameW(self.ptr(), address, buf.as_mut_ptr(), buf.buf_len() as _)
53 })
54 .map(|_| buf.to_string())
55 }
56
57 #[must_use]
60 pub fn GetModuleBaseName(&self, hmodule: Option<&HINSTANCE>) -> SysResult<String> {
61 let mut buf = WString::new_alloc_buf(MAX_PATH + 1); bool_to_sysresult(unsafe {
63 ffi::GetModuleBaseNameW(
64 self.ptr(),
65 hmodule.map_or(std::ptr::null_mut(), |h| h.ptr()),
66 buf.as_mut_ptr(),
67 buf.buf_len() as _,
68 )
69 })
70 .map(|_| buf.to_string())
71 }
72
73 #[must_use]
76 pub fn GetModuleFileNameEx(&self, hmodule: Option<&HINSTANCE>) -> SysResult<String> {
77 let mut buf = WString::new_alloc_buf(MAX_PATH + 1); bool_to_sysresult(unsafe {
79 ffi::GetModuleFileNameExW(
80 self.ptr(),
81 hmodule.map_or(std::ptr::null_mut(), |h| h.ptr()),
82 buf.as_mut_ptr(),
83 buf.buf_len() as _,
84 )
85 })
86 .map(|_| buf.to_string())
87 }
88
89 #[must_use]
92 pub fn GetModuleInformation(&self, hmodule: Option<&HINSTANCE>) -> SysResult<MODULEINFO> {
93 let mut mi = MODULEINFO::default();
94 bool_to_sysresult(unsafe {
95 ffi::GetModuleInformation(
96 self.ptr(),
97 hmodule.map_or(std::ptr::null_mut(), |h| h.ptr()),
98 pvoid(&mut mi),
99 std::mem::size_of::<MODULEINFO>() as _,
100 )
101 })
102 .map(|_| mi)
103 }
104
105 #[must_use]
108 pub fn GetProcessImageFileName(&self) -> SysResult<String> {
109 let mut buf = WString::new_alloc_buf(MAX_PATH + 1); bool_to_sysresult(unsafe {
111 ffi::GetProcessImageFileNameW(self.ptr(), buf.as_mut_ptr(), buf.buf_len() as _)
112 })
113 .map(|_| buf.to_string())
114 }
115
116 #[must_use]
119 pub fn GetProcessMemoryInfo(&self) -> SysResult<PROCESS_MEMORY_COUNTERS_EX> {
120 let mut pmc = PROCESS_MEMORY_COUNTERS_EX::default();
121 bool_to_sysresult(unsafe {
122 ffi::GetProcessMemoryInfo(
123 self.ptr(),
124 pvoid(&mut pmc),
125 std::mem::size_of::<PROCESS_MEMORY_COUNTERS_EX>() as _,
126 )
127 })
128 .map(|_| pmc)
129 }
130}